﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LPrisaMVC.Entities;
using LPrisaMVC.DAO;
using Microsoft.Practices.Unity;

namespace LPrisaMVC.BusinessLogic
{
    public class ProductoBL : IProductoBL
    {
        [Dependency]
        public IProductoDAO productoDAO { get; set; }

        [Dependency]
        public IHistorialVentaDAO historialDAO { get; set; }

        public List<PRODUCTO> GetAllFromProducto()
        {
            return productoDAO.GetAllFromProducto();
        }

        public List<PRODUCTO> GetFromProductoByDescripcion(string descripcion)
        {
            return productoDAO.GetFromProductoByDescripcion(descripcion);
        }

        public List<PRODUCTO> GetAllFromProductosByDescripcionAndStockBajo(string descripcion)
        {
            return productoDAO.GetAllFromProductosByDescripcionAndStockBajo(descripcion);
        }

        public PRODUCTO GetOneProductoByDescripcion(string codigo)
        {
            return productoDAO.GetOneProductoByDescripcion(codigo);
        }

        public PRODUCTO GetFromProductoById(int id)
        {
            return productoDAO.GetFromProductoById(id);
        }

        public void AddProducto(PRODUCTO producto)
        {
            var duplicidad = productoDAO.ExisteDuplicidadProdDescripcion(producto.Descripcion, producto.Id);

            if (!duplicidad)
            {
               productoDAO.AddProducto(producto); 
            }
            else
            {
                var error = string.Format("Ya existe un producto con la misma descripción\n" +
                    "Producto: " + producto.Descripcion);
                throw new Exception(error);
            }
        }

        public void UpdateProducto(PRODUCTO producto)
        {
            var duplicidad = productoDAO.ExisteDuplicidadProdDescripcion(producto.Descripcion, producto.Id);

            if (!duplicidad)
            {
                productoDAO.UpdateProducto(producto);
            }
            else
            {
                var error = string.Format("Ya existe un producto con la misma descripción: \n{0}", producto.Descripcion);
                throw new Exception(error);
            }

        }

        public void RemoveProducto(int id)
        {
            var hijos = historialDAO.GetAllHistorialByProductoId(id);

            if (hijos == true)
            {
                var error = string.Format("No se puede eliminar el Producto ");
                throw new Exception(error);
            }
            else
            {
                productoDAO.RemoveProducto(id);
            }

        }        
    }
}
